#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<set>
#include<map>
#include<vector>
#include<algorithm>
#include<queue>
#include<iostream>
using namespace std;

struct edge
{
	int to, c;
	edge(int to = 0, int c = 0) : to(to), c(c) {}
};

edge ed[40005];
vector<int> g[1005];
int sze = 0;

void AddE(int f, int to)
{
	g[f].push_back(sze);
	ed[sze++] = edge(to, 1);
	g[to].push_back(sze);
	ed[sze++] = edge(f, 0);
}

bool u[1005];
int d[1004];
int ptr[1005];
pair<int, int> e[10004];
int ide[10005];

bool bfs(int st, int fin)
{
	memset(u, 0, sizeof(u));
	queue<int> q;
	q.push(st);
	u[st] = 1;
	d[st] = 0;
	while(!q.empty())
	{
		int v = q.front(); q.pop();
		for(int i = 0; i < g[v].size(); i++)
		{
			int to = ed[g[v][i]].to;
			if(!u[to] && ed[g[v][i]].c > 0)
			{
				u[to] = 1;
				d[to] = d[v] + 1;
				q.push(to);
			}
		}
	}
	return u[fin];
}

int dfs(int v, int fin)
{
	if(v == fin)
		return 1;

	for(int i = ptr[v]; i < g[v].size(); i++)
	{
		int id = g[v][i];
		if(ed[id].c > 0 && d[ed[id].to] == d[v] + 1)
		{
			int fl = dfs(ed[id].to, fin);
			if(fl > 0)
			{
				ed[id].c --;
				ed[id^1].c ++;
				return fl;
			}
			ptr[v] ++;
		}
	}
	return 0;
}

int getFlow(int st, int fin)
{
	int flow = 0;
	while(bfs(st, fin))
	{
		memset(ptr, 0, sizeof(ptr));
		while(true)
		{
			int add = dfs(st, fin);
			if(add == 0)
				break;
			flow += add;
		}
	}
	return flow;
}

bool can[2][1004];
void bfs2(int st, bool* can, int che)
{
	queue<int> q;
	q.push(st);
	can[st] = 1;
	while(!q.empty())
	{
		int v = q.front(); q.pop();
		for(int i = 0; i < g[v].size(); i++)
		{
			int to = ed[g[v][i]].to;
			if(!can[to] && ed[g[v][i]].c == che)
			{
				can[to] = 1;
				q.push(to);
			}
		}
	}
}

int main()
{
	while(true)
	{
		int n, m, s, t;
		scanf("%d%d%d%d", &n, &m, &s, &t);
		--s, --t;

		if(n == 0)
			break;

		for(int i = 0; i < n; i++)
			g[i].clear();
		sze = 0;

		for(int i = 0; i < m; i++)
		{
			int a, b;
			scanf("%d%d", &a, &b);
			e[i] = make_pair(a-1, b-1);
			ide[i] = sze;
			AddE(a-1, b-1);
		}

		int sum = getFlow(s, t);
		
		memset(can, 0, sizeof(can));
		bfs2(s, can[0], 1);
		bfs2(t, can[1], 0);
		

		int add = 0;
		for(int i = 0; i < m; i++)
		{
			if(ed[ide[i]].c > 0 && can[1][e[i].first] && can[0][e[i].second])
				add ++;
		}
		if(add > 0)
			sum ++;
		printf("%d %d\n", sum, add);
	}

	

	return 0;
}
